import numpy as np

# 创建一个示例数组
arr = np.array([1, 2, np.nan, 4, 5, 6, np.nan, 8, 9, 9])

# 检查数组中的缺失值（NaN）
print('原数组:\n', arr)
print("缺失值检测:\n", np.isnan(arr))  # 返回布尔数组，True 表示缺失值
print("================缺失值检测================")

# 删除包含缺失值的元素
arr_cleaned = arr[~np.isnan(arr)] # 通过取非赋值实现删除
print("删除缺失值:\n", arr_cleaned)
print("================删除缺失值================")

# 使用 0 填充缺失值
arr_filled = np.nan_to_num(arr, nan=0)
print("填充缺失值:\n", arr_filled)
print("================用0填充缺失值================")

# 检查数组中是否有重复值
arr = np.array([1, 2, 2, 3, 3, 3, 4])
unique_values, indices = np.unique(arr, return_index=True)
print("唯一值:", unique_values)  # 输出: 元素[1 2 3 4]
print("唯一值的索引位置:", indices)  # 输出: 索引[0 1 3 6]
print("================重复值检测================")

# 删除重复值，仅保留唯一值
arr_no_duplicates = np.unique(arr)
print("删除重复值:\n", arr_no_duplicates)
print("================删除重复值================")

# 使用 Z-Score 方法检测异常值（假设阈值为 3）
z_score = (arr - np.mean(arr)) / np.std(arr)
outliers = np.where(np.abs(z_score) > 3)
print("异常值检测:\n", outliers)
print("================异常值检测================")

# 将大于 100 的异常值替换为中位数
arr[arr > 100] = np.median(arr)
print("异常值替换:\n", arr)
print("================异常值替换================")

# 处理字符串数组，去除空格
str_arr = np.array([' hello ', 'world  ', '  numpy '])
str_arr_cleaned = np.char.strip(str_arr)
print("字符串处理（去除空格）:\n", str_arr_cleaned)
print("================字符串处理================")

# 将数组转换为 float 类型
arr_float = arr.astype(float)
print("数据类型转换:\n", arr_float)
print("================数据类型转换================")

# 对数组进行归一化处理
arr_normalized = (arr - np.min(arr)) / (np.max(arr) - np.min(arr))
print("标准化与归一化:\n", arr_normalized)
print("================标准化与归一化================")

# 将数组中的 1 替换为 0
arr_replaced = np.where(arr == 1, 0, arr)
print("值映射与替换:\n", arr_replaced)
print("================值映射与替换================")

# 使用卷积方法进行数据去噪
arr_denoised = np.convolve(arr, np.ones(5) / 5, mode='valid')
print("数据去噪:\n", arr_denoised)
print("================数据去噪================")